package ongd.web;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import ongd.negocio.gestion.ControladorApadrinamiento;
import ongd.negocio.gestion.ControladorProyectoSC;
import ongd.negocio.gestion.Proyecto;
import ongd.servicios.persistencia.exceptions.IllegalOrphanException;
import ongd.servicios.persistencia.exceptions.NonexistentEntityException;
import org.primefaces.context.RequestContext;

/**
 * Clase que se encargará de listar los proyectos que no estén activos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Listado_BajaProyecto extends ABean {

    /**
     * Objeto de tipo ControladorApadrinamiento que será necesario para 
     * realizar todas las operaciones necesarias para los apdrinamientos.
     */
    private ControladorApadrinamiento controlApad;
    /**
     * Objeto de tipo ControladorProyectoSC que será necesario para 
     * realizar todas las operaciones necesarias para los proyectosSC.
     */
    private ControladorProyectoSC controlPSC;
    /**
     * Objeto de tipo lista de proyectos que mantiene una lista con todos los proyectos que 
     * están desactivados de un determinado tipo.
     */
    private List<Proyecto> proyectos;
    /**
     * Objeto de tipo proyecto que mantiene el valor del proyecto que vamos a activar.
     */
    private Proyecto proyecto;
    /**
     * Booleano que indica si estamos trabajando con proyectos de cooperación.
     */
    private boolean cooperacion;
    /**
     * Boolean que indica si estamos trabajando con proyectos de apadrinamiento.
     */
    private boolean apadrinamiento;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /**
     * Constructor.
     */
    public Listado_BajaProyecto() {
        proyecto = new Proyecto();
        proyectos = new ArrayList<Proyecto>();
    }

    /**
     * Método que carga las variables iniciales según el modo de acceso a la página.
     */
    @Override
    public void cargaInicial() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            SesionBean sesion = getSesionBean();
            if (sesion.iniciadaSesion()) {
                if (sesion.getStrVariable().compareTo("cooperacion") == 0) {
                    titulo = "Gestionar Bajas - Proyectos de Cooperación";
                    controlPSC = sesion.getControladorProyectoSC();
                    proyectos = controlPSC.buscarProyectosDesactivadosTipo("C");
                    cooperacion = true;
                    apadrinamiento = false;
                    proyecto.setTipo("C");
                } else {
                    if (sesion.getStrVariable().compareTo("sensibilizacion") == 0) {
                        titulo = "Gestionar Bajas - Proyectos de Sensibilización";
                        controlPSC = sesion.getControladorProyectoSC();
                        proyectos = controlPSC.buscarProyectosDesactivadosTipo("S");
                        cooperacion = false;
                        apadrinamiento = false;
                        proyecto.setTipo("S");
                    } else {
                        if (sesion.getStrVariable().compareTo("apadrinamiento") == 0) {
                            titulo = "Gestionar Baja - Proyectos de Apadrinamiento";
                            controlApad = sesion.getControladorApadrinamiento();
                            proyectos = controlApad.obtenerProyectosDesactivadosApadrinamiento();
                            cooperacion = false;
                            apadrinamiento = true;
                            proyecto.setTipo("AP");
                        }
                    }
                }
            }
        }
    }

    /**
     * Método que activa un proyecto.
     * @return null.
     */
    public String activar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (!apadrinamiento) {
                    controlPSC.activarProyecto(proyecto);
                    requestContext.addCallbackParam("activadoOK", true);
                    if (cooperacion) {
                        proyectos = controlPSC.buscarProyectosDesactivadosTipo("C");
                    } else {
                        proyectos = controlPSC.buscarProyectosDesactivadosTipo("S");
                    }
                } else {
                    controlApad.activarProyecto(proyecto);
                    requestContext.addCallbackParam("activadoOK", true);
                    proyectos = controlApad.obtenerProyectosDesactivadosApadrinamiento();
                }

            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_BajaProyecto.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_BajaProyecto.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Listado_BajaProyecto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que nos dice si estamso trabajando con proyectos de apadrinamiento.
     * @return true, si son de apadrinamiento o fals esi son de otro tipo.
     */
    public boolean isApadrinamiento() {
        return apadrinamiento;
    }

    /**
     * Método que devuelve el controlador de apadrinamiento.
     * @return controlador de apadrinamiento.
     * @see #setControlApad
     */
    public ControladorApadrinamiento getControlApad() {
        return controlApad;
    }

    /**
     * Método que devuelve el controlador de proyecto de cooperación o sensibilización.
     * @return controlador.
     * @see #setControlPSC
     */
    public ControladorProyectoSC getControlPSC() {
        return controlPSC;
    }

    /**
     * Método que nos dice si estamso trabajando con proyectos de cooperación.
     * @return true si trabajamos con proyectos de cooperacion o false si no es así.
     */
    public boolean isCooperacion() {
        return cooperacion;
    }

    /**
     * Método que devuelve el proyecto que vamos a activar.
     * @return proyecto.
     * @see #setProyecto
     */
    public Proyecto getProyecto() {
        return proyecto;
    }

    /**
     * Método que devuelve la lista de proyectos con las que estamos trabajando.
     * @return lista de proyectos.
     * @see #setProyectos
     */
    public List<Proyecto> getProyectos() {
        return proyectos;
    }

    /**
     * Método que asigna un nuevo valor a la variable que indica si estamos trabajando con proyectos de apadrinamiento.
     * @param apadrinamiento nuevo valor de la variable.
     */
    public void setApadrinamiento(boolean apadrinamiento) {
        this.apadrinamiento = apadrinamiento;
    }

    /**
     * Método que asigna un nuevo valor al controlador de apadrinamiento.
     * @param controlApad nuevo valor del controlador. 
     * @see #getControlApad
     */
    public void setControlApad(ControladorApadrinamiento controlApad) {
        this.controlApad = controlApad;
    }

    /**
     * Método que asigna un nuevo valor al controlador de proyectos de cooperacion o sensibilizacion.
     * @param controlPSC nuevo valor del controlador.
     * @see #getControlPSC
     */
    public void setControlPSC(ControladorProyectoSC controlPSC) {
        this.controlPSC = controlPSC;
    }

    /**
     * Método que asigna un nuevo valor a la variable que indica si estamos trabajando con proyectos de cooperación.
     * @param cooperacion nuevo valor de la variable.
     */
    public void setCooperacion(boolean cooperacion) {
        this.cooperacion = cooperacion;
    }

    /**
     * Método que asigna un nuevo proyecto a la variable.
     * @param proyecto nuevo valor de la variable.
     * @see #getProyecto
     */
    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    /**
     * Método que asigna una nueva lista de proyectos.
     * @param proyectos nueva lista de proyectos.
     * @see #getProyectos
     */
    public void setProyectos(List<Proyecto> proyectos) {
        this.proyectos = proyectos;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
